package com.example.auth.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.auth.common.R;
import com.example.auth.model.dto.LoginDTO;
import com.example.auth.model.dto.UserAddDTO;
import com.example.auth.model.dto.UserInfoDTO;
import com.example.auth.model.dto.UserUpdateDTO;
import com.example.auth.model.entity.SysUser;
import com.example.auth.model.vo.SysUserVo;

import java.util.List;

/**
 * 用户服务接口
 */
public interface SysUserService extends IService<SysUser> {

    /**
     * 用户登录
     *
     * @param loginDTO 登录信息
     * @return token
     */
    R<String> login(LoginDTO loginDTO);

    /**
     * 用户注销
     */
    void logout();

    /**
     * 获取当前登录用户信息
     *
     * @return 用户信息
     */
    R<UserInfoDTO> getCurrentUserInfo();

    /**
     * 获取用户角色
     *
     * @param userId 用户ID
     * @return 角色编码数组
     */
    String[] getUserRoles(Long userId);

    /**
     * 获取用户列表（分页）
     *
     * @param current 当前页
     * @param size 每页大小
     * @param username 用户名
     * @param nickname 昵称
     * @param phone 手机号
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 用户分页列表
     */
    Page<SysUser> getUserPage(Integer current, Integer size, String username, String nickname, String phone, String startDate, String endDate);

    /**
     * 根据部门ID获取用户列表
     *
     * @param departmentId 部门ID
     * @return 用户列表
     */
    List<SysUser> getUsersByDeptId(Long departmentId);

    /**
     * 获取用户详情
     *
     * @param id 用户ID
     * @return 用户VO
     */
    SysUserVo getUserVoById(Long id);

    /**
     * 添加用户
     *
     * @param userDTO 用户DTO
     * @return 是否成功
     */
    boolean addUser(UserAddDTO userDTO);

    /**
     * 更新用户
     *
     * @param userDTO 用户DTO
     * @return 是否成功
     */
    boolean updateUser(UserUpdateDTO userDTO);

    /**
     * 重置用户密码
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean resetPassword(Long userId);

    /**
     * 更新用户状态
     *
     * @param userId 用户ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateUserStatus(Long userId, Integer status);

    /**
     * 分配用户角色
     *
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     * @return 是否成功
     */
    boolean assignRoles(Long userId, List<Long> roleIds);

    /**
     * 获取用户角色ID列表
     *
     * @param userId 用户ID
     * @return 角色ID列表
     */
    List<Long> getUserRoleIds(Long userId);
}
